'use strict'

import fs from 'fs'
import { app, protocol, BrowserWindow, ipcMain, globalShortcut, dialog, shell } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import { autoUpdater } from "electron-updater"

const isDevelopment = process.env.NODE_ENV !== 'production'

protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true, stream: true } }
])

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

app.on('ready', async () => {
  createWindow()
})

// 系统快捷键
app.whenReady().then(() => {
  globalShortcut.register('F11', () => {
    console.log('F11')
  })
  globalShortcut.register('Ctrl+R', () => {
    console.log('Ctrl+R')
  })
  globalShortcut.register('Ctrl+Shift+R', () => {
    console.log('Ctrl+Shift+R')
  })
  globalShortcut.register('Ctrl+Shift+I', () => {
    console.log('Ctrl+Shift+I')
  })
})

if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}

// 创建窗口
let windowZoom = 1
async function createWindow() {
  // 锁
  const lock = app.requestSingleInstanceLock()
  // 没有锁，说明这是第二个程序
  if (!lock) {
    app.quit()
  } else {
    // 首个程序触发事件
    app.on('second-instance', () => {
      // 当运行第二个实例时,将会聚焦到myWindow这个窗口
      if (win) {
        // 恢复窗口
        if (win.isMinimized()) win.restore()
        // 焦点
        win.focus()
      }
    })
  }

  const win = new BrowserWindow({
    // 不可移动
    movable: false,
    // 无边框
    frame: false,
    // 全屏
    fullscreen: true,
    // 允许渲染进程使用 Node
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      webSecurity: false
    },
  })

  // 窗口关闭时退出程序
  win.on('closed', () => {
    app.exit()
  })

  // 窗口恢复
  win.on('focus', function () {
    // 重新设置缩放
    win.webContents.setZoomFactor(windowZoom)
    console.log('focus')
  })

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL + '#/')
    if (!process.env.IS_TEST) {
      win.webContents.openDevTools()
    }
  } else {
    // win.webContents.openDevTools()
    // 创建APP
    createProtocol('app')
    // 加载渲染进程
    win.loadURL(`file://${__dirname}/index.html#/`)
  }

  // 当开始检查更新
  autoUpdater.on('checking-for-update', function () {
    win.webContents.send('auto-update-loading')
  })
  // 发无更新可用
  autoUpdater.on('update-not-available', function () {
    win.webContents.send('auto-update-not')
  })
  // 当有可用更新
  autoUpdater.on('update-available', function (info) {
    win.webContents.send('auto-update-down', info)
  });
  // 当更新完成时
  autoUpdater.on('update-downloaded', function () {
    win.webContents.send('auto-update-ok')
  });
  // 当下载时
  autoUpdater.on('download-progress', progress => {
    win.webContents.send('auto-update-progress', progress)
  })

  // 自动更新服务
  ipcMain.on('auto-update', function () {
    // 开始检查更新
    autoUpdater.checkForUpdates()
  })

  // 安装自动更新
  ipcMain.on('auto-update-install', function () {
    autoUpdater.quitAndInstall(true, true)
  })

  // 最小化
  ipcMain.on('window-min', function() {
    win.minimize();
  })

  // 全屏化
  ipcMain.on('window-full', function() {
    if(win.isFullScreen()) {
      win.setFullScreen(false);
      win.maximize();
    } else {
      win.setFullScreen(true);
    }
  })

  // 关闭
  ipcMain.on('exit', function() {
    app.exit();
  })

  // 重启
  ipcMain.on('reboot', function() {
    app.relaunch()
    app.exit()
  })

  // 版本号
  ipcMain.on('version', function (event) {
    event.returnValue = app.getVersion()
  })

  // 窗口信息
  ipcMain.on('window-info', function (event) {
    event.returnValue = win.getContentBounds()
  })

  // 打开文件选择器
  ipcMain.on('dialog-open', function (event, options) {
    event.returnValue = dialog.showOpenDialogSync(options)
  })

  // 保存文件选择器
  ipcMain.on('dialog-save', function (event, options) {
    event.returnValue = dialog.showSaveDialogSync(options)
  })

  // 获取常用路径
  ipcMain.on('path', function (event, name) {
    event.returnValue = app.getPath(name)
  })

  // 获取打印机
  ipcMain.on('get-printers', function (event) {
    event.returnValue = win.webContents.getPrinters()
  })

  // PDF预览
  ipcMain.on('pdf-show', function (event, path) {
    createPDF(path)
  })

  // 新窗口
  ipcMain.on('new-win', function (event, url) {
    createWin(url)
  })

  // 缩放
  ipcMain.on('zoom', function (event) {
    event.returnValue = win.webContents.getZoomFactor()
  })
  
  ipcMain.on('zoom-set', function (event, zoom) {
    windowZoom = zoom
    win.webContents.setZoomFactor(zoom)
  })
}

// 创建PDF窗口
async function createPDF(path) {
  const win = new BrowserWindow({
    show: true
  });
  win.removeMenu()
  win.loadFile(path)
}

// 创建新窗口
async function createWin(url) {
  const win = new BrowserWindow({
    width: 1200,
    height: 800
  })

  win.removeMenu()
  win.maximize()
  win.loadURL(url)
}